#pragma once

#include <stddef.h>
#include <pthread.h>
#include <vector>
#include <deque>

/**
 * @brief 工作任务结构
 */
struct Work 
{
    void (*f)(void *) = NULL;   ///< 工作函数指针
    void *arg = NULL;           ///< 传递给工作函数的参数
};

/**
 * @brief 线程池结构
 */
struct ThreadPool 
{
    std::vector<pthread_t> threads; ///< 工作线程数组
    std::deque<Work> queue;         ///< 任务队列
    pthread_mutex_t mu;             ///< 互斥锁
    pthread_cond_t not_empty;       ///< 条件变量，队列非空时通知
};

/**
 * @brief 初始化线程池
 * @param tp 线程池指针
 * @param num_threads 线程数量
 */
void thread_pool_init(ThreadPool *tp, size_t num_threads);

/**
 * @brief 向线程池提交任务
 * @param tp 线程池指针
 * @param f 工作函数
 * @param arg 传递给工作函数的参数
 */
void thread_pool_queue(ThreadPool *tp, void (*f)(void *), void *arg); 